package cn.tedu.core;

import cn.tedu.http.EmptyRequestException;
import cn.tedu.http.HttpRequest;
import cn.tedu.http.HttpResponse;
import cn.tedu.servlet.LoginServlet;
import cn.tedu.servlet.RegisterServlet;
import cn.tedu.servlet.ShowAllDataServlet;

import java.io.File;
import java.io.IOException;
import java.net.Socket;

/**
 * Author：程Sir
 * Name： SmallServer
 * Content:
 *  负责与指定客户端进行HTTP交互
 *     该线程将来与客户端交互的过程必须遵守HTTP协议要求，采取一问一答的方式进行,固定的解析步骤：
 *     1. 解析请求【问】
 *     2. 处理请求
 *     3. 响应请求【答】
 *
 *
 *
 */
public class RequestHandler implements Runnable {
    // 声明全局变量socket [socket中包含了所有客户端的请求信息]
    private Socket socket;
    public RequestHandler(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {

        try {
            // 1.请求解析
            HttpRequest httpRequest = new HttpRequest(socket);
            HttpResponse httpResponse = new HttpResponse(socket);

            // 2. 处理请求
            // 首先通过 httpRequest 获取请求中的抽象路径
            String url = httpRequest.getUrl();

            if ("/myweb/register.do".equals(httpRequest.getRequestURL())){
                // 是一个注册功能,就交给注册的servlet
                RegisterServlet servlet = new RegisterServlet();
                servlet.service(httpRequest, httpResponse);

            }else if ("/myweb/login.do".equals(httpRequest.getRequestURL())){
                // 是一个登录功能，就交给登录的servlet
                LoginServlet loginServlet = new LoginServlet();
                loginServlet.service(httpRequest, httpResponse);

            }else if("/myweb/showAllData.do".equals(httpRequest.getRequestURL())){
                // 是一个查询功能，交给查询的servlet
                ShowAllDataServlet showAllDataServlet = new ShowAllDataServlet();
                showAllDataServlet.service(httpRequest,httpResponse);

            }else{
                // 不是功能，那就是实体资源
                /*
                ./webapps/ 可以认为是一个固定的资源请求服务器，需要某个应用的资源文件，就可以在此服务器下面查找
                要求客户端输入请求资源时，一并要输入应用的名称例如：
                    应用是找：myweb
                    资源是找：index.html
                    客户端发送的请求就应是： http://localhost:8080/myweb/index.html
             */
                File  file = new File("./webapps/"+url);

                // 若该资源存在且是一个文件，则正常做出响应
                // 3.做出响应
                if(file.exists() && file.isFile()){
                    System.out.println("资源是存在的，下面进行反馈...");
                    // 当前存在的资源需要发送给响应对象
                    httpResponse.setFileEntity(file);

                }else { // 如果资源不存在或者访问的是一个目录，则反馈404页面
                    System.out.println("资源不存在，做404页面输出....");
                    file = new File("./webapps/commons/404.html");
                    // 访问资源不存在时，发送固定的404页面资源，依旧需要传送给响应对象
                    httpResponse.setStatusCode(404); //告知浏览器，当前请求资源是不存在的！
                    httpResponse.setStatuseReason("Not Found!"); // 解释和说明的内容
                    httpResponse.setFileEntity(file);
                }
            }
            // 响应对象做具体的响应操作
            httpResponse.flush();
            System.out.println("数据响应完毕！");

        } catch (EmptyRequestException e) {
            System.err.println(e.getMessage()); // 控制台信息输出的时候显示的是红色，但是不会按逻辑输出
        } finally {
            try {
                // 一次请求，对应一次响应，响应结束，socket关闭，达到释放资源的目的
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


}
